package exercise;

public class EX5_OOP4 {

	//VO 클래스, Service 클래스 작성법 익히기
	
	
	public static void main(String[] args) {
		
		RetangleVO r = new RetangleVO(35,45, "silver");
		float area = RetangleService.getArea(r.width, r.heigt);
		System.out.println( area );
		
		
		
		//FanVO f = new FanVO(new FanVO().FAST,true,10,"yellow");
		FanVO f = new FanVO(FanVO.FAST,true,10,"yellow");
		//System.out.println(
		//FanVO.showFanInfo(f.speed,f.on,f.radus,f.color));
		System.out.println(FanService.showFanInfo(f));
			
		
		AccountVO a =
		new AccountVO(1122,20000,4.5F,"20131108");
		AccountService.withdraw(2500,a.balance);
		System.out.println(a.balance);
		//call by value(값에 의해 전달)
		//메서드의 매개변수 유형이 기본 자료형인 경우
		//기본 자료형 값을 메서드의 매개변수로 전달하면 
		//JVM은 메서드의 지역변수에 그 값을 복사해 줌
		//따라서,메서드의 지역변수 값을 변경하더라도,
		//전달해준 변수에는 영향을 미치지는 않음
		
		
		AccountService.withdraw(2500,a);
		System.out.println(a.balance);
		//call by reference(주소에 의한 전달)
		//메서드의 매개변수 유형이 참조 자료형인 경우
		//만일, 참조형 변수를 메서드의 매개변수로 전달하면
		//지역변수는 참조형 변수가 전달해 준 객체를 가리키게 됨
		//즉, 참조형 변수에 저장된 값은 실제 값이 아니고
		//그 값을 가리키는 주소를 의미하기 때문임
		//따라서, 메서드에서 참조된 객체에 변경을 가하면
		//그 변화는 호출된 코드에도 반영됨
		
		
	}

}

class RetangleVO{
	float width=1.0F;
	float heigt=1.0F;
	String color = "White";
	
	public RetangleVO() {}
		public RetangleVO(float width, float heigt, String color){
		this.width = width;
		this.heigt = heigt;
		this.color = color;
	}
}

class RetangleService {
	static float getArea(float width, float heigt) { 
		return (2 * width) +(2 * heigt);
		}
	static float getPerimter(float width, float heigt) { 
		return (2 * width) +(2 * heigt);
	}
	
}

class FanVO {
	// 속도를 나타내는 상수들은
	//객체 생성없이 바로 사용가능해야 함
	//따라서, static final 예약어를 사용함
	//한편, JDK5 이상에서는 이것을 대체하기 위해
	//Enum 이라는새로운 클래스 자료형이 추가됨
	
	static final int SLOW = 1;
	static final int MEDIUM = 2;
	static final int FAST = 3;
	
	int speed;
	boolean on;
	float radius;
	String color;
	
	public FanVO() {
	
		speed =this.SLOW; on=false;
		radius = 5.0F;
		color = "blue";
	 }
	public FanVO(int speed, boolean on, float radius, String color){
		this.speed=speed;this.on=on;
		this.radius=radius;this.color=color;
    }
 }

class FanService {
	//메서드 다중정의overloading
	//메서드 서명만 다르면 메서드 이름은 동일하게 작성가능
	//static String showFanInfo(int speed, boolean on, float radius)
	//static String showFanInfo(FanVO f){
	
	
	static String showFanInfo(FanVO f){
		
		String msg = "";
		if (f.on)
			msg = f.speed + "," + f.color + "," + f.radius + "," + "작동중";
		else
			msg = f.color + "," + f.radius + "," + "꺼져있음";
		return msg;
	}/*
}	
		String msg = "";
		if (on == true)
			msg = speed + "," + color + "," + radius + "," + "작동중";
			// System.out.println(speed + "," + color + "," + radius + "," + "작동중");
		else
			msg = color + "," + radius + "," + "꺼져있음";
			// System.out.println(color + "," + radius + "," + "꺼져있음");
		return msg;
	}
	
}
*/
static String toString(int speed, boolean on, float radius, String color){
		
		String msg = "";
		if (on == true)
			msg = speed + "," + color + "," + radius + "," + "작동중";
			// System.out.println(speed + "," + color + "," + radius + "," + "작동중");
		else
			msg = color + "," + radius + "," + "꺼져있음";
			// System.out.println(color + "," + radius + "," + "꺼져있음");
		return msg;
	}
	
	
}


class AccountVO {
	int aid;
	int balance;
	float interestRate;
	String dateCreated;
	
	public AccountVO () {
		aid = 0; balance=0; interestRate=0;
	}
	
	public AccountVO (int aid, int balance, float interestRate,String dateCreated){
		this.aid = aid;
		this.balance = balance;
		this.interestRate = interestRate;
		this.dateCreated = dateCreated;
		
	}
	
}

class AccountService {
	
	static float getMonthlyInterestRate(float interestRate ) {
		return interestRate / 12;}
	
		static int withdraw (int gold, int balence ) {
			balence -= gold;
			System.out.println( "인출 후 잔액:"+balence);
			return balence;
		  }
			
		
		static int withdraw (int gold, AccountVO a) {
			a.balance -= gold;
			System.out.println( "인출 후 잔액:" + a.balance);
			return a.balance;
		  }
		
		
		
			static int deposit(int gold, int balence ) {
				return balence + gold;
				
			}
		
}


class StockVO {
	String sname;
	int previousClosingPrice;
	int currentPrice;
	
	public StockVO() {}
	public StockVO(String sname, int previousClosingPrice, int currentPrice) {
		this.sname = sname;
		this.previousClosingPrice = previousClosingPrice;
		this.currentPrice = currentPrice;
		
	}
		
	
}

class StockService {
	
	
}











